<?php
declare (strict_types=1);

namespace addons\WeChat\driver;

use addons\WeChat\exception\WeChatException;
use WeChat\Oauth;
use WeChat\Script;
use WeChat\Template;
use WeChat\User;

class WeChat
{
    /**
     * @var mixed 微信配置参数
     */
    protected $config;

    public function __construct()
    {
        $this->config = config('pay')['wechat'];
    }

    /**
     * @param $redirect_url
     * @param $state
     * @param $scope - 授权类类型(可选值snsapi_base - 获取openid用|snsapi_userinfo - 获取微信用户信息用)
     * @return string
     * @throws WeChatException
     * 原点 2022年12月8日15:38:24 微信公众号授权跳转接口
     */
    public function getOauthRedirect($redirect_url, $state = '', $scope = 'snsapi_base')
    {
        try {
            return Oauth::instance($this->config)->getOauthRedirect($redirect_url, $state, $scope);
        } catch (\Exception $e) {
            throw new WeChatException('加载失败：' . $e->getMessage(), -1);
        }
    }

    /**
     * @param $code
     * @return array
     * @throws WeChatException
     * 原点 2022年12月8日15:40:15 获取openid,静默授权(需getOauthRedirect方法scope需为 snsapi_base)
     */
    public function getOauthAccessToken($code)
    {
        try {
            return Oauth::instance($this->config)->getOauthAccessToken($code);
        } catch (\Exception $e) {
            throw new WeChatException('加载失败：' . $e->getMessage(), -1);
        }
    }

    /**
     * @param $access_token
     * @param $openid
     * @param $lang
     * @return array
     * @throws WeChatException
     * 原点 2022年12月8日15:43:21 拉取用户信息(需getOauthRedirect方法scope需为 snsapi_userinfo)
     */
    public function getUserInfo($access_token, $openid, $lang = 'zh_CN')
    {
        try {
            return Oauth::instance($this->config)->getUserInfo($access_token, $openid, $lang);
        } catch (\Exception $e) {
            throw new WeChatException('获取失败：' . $e->getMessage(), -1);
        }
    }

    /**
     * @param $openid 接受模板消息用户的openid
     * @param $template_id 模板消息id
     * @param $url 模板消息跳转链接
     * @param $data 模板消息数据
     * @return array
     * @throws WeChatException
     * 原点 2022年12月8日15:43:21 拉取用户信息(需getOauthRedirect方法scope需为 snsapi_userinfo)
     */
    public function sendTemplateMsg($openid, $template_id, $url = '', $data = [])
    {
        try {
            $data = [
                'touser' => $openid, // 接受模板消息用户的openid
                'template_id' => $template_id, // 模板消息id
                'url' => $url, // 模板消息跳转链接
                'data' => $data, // 模板消息数据
            ];
            return Template::instance($this->config)->send($data);
        } catch (\Exception $e) {
            throw new WeChatException('获取失败：' . $e->getMessage(), -1);
        }
    }

    /**
     * 获取JsApi使用签名
     */
    public function getJsSign($url)
    {
        try {
            return Script::instance($this->config)->getJsSign($url);
        } catch (\Exception $e) {
            throw new WeChatException('获取失败：' . $e->getMessage(), -1);
        }
    }

    /**
     * 获取用户基本信息（包括UnionID机制）
     */
    public function getUserInfoList($openid, $lang = 'zh_CN')
    {
        try {
            return User::instance($this->config)->getUserInfo($openid, $lang);
        } catch (\Exception $e) {
            throw new WeChatException('加载失败：' . $e->getMessage(), -1);
        }
    }
}